<?php

namespace App\Http\Controllers;

class ApiBaseController extends Controller{

    public function __construct()
    {
       // $this->middleware('guest');
    	$this->api_secret = env('API_SECRET');
    	$param = array_merge( $_GET, $_POST );
        $_uri = parse_url($_SERVER['REQUEST_URI']);

        $sign = isset( $param['sign'])? $param['sign'] :'';
    	if ( !self::verifySig( $sign, $this->api_secret, $param)) {
    		echo json_encode( ['code'=>100, 'msg'=>'签名错误']);
            exit();
    	}

        /*1.判断是否有登录标记，有标记则直接过 无标记则 取token,
          2.有token 则判断token 是否有效 
          3. 写入登录日志 同时更新用户表 写标记   
        */
    }

    /**
     * 统一校验签名
     *
     * @param $sig    string  - 需要校验的签名
     * @param $param    array  - 需要校验的参数，没有默认使用$_GET
     * @return bool           - 如果通过校验，返回true, 不通过则返回false;
     */
    public static function verifySig( $sig, $secret, $param = array() )
    {
        return true;
        if (empty( $param ) || ! is_array( $param ))
        {
            $param = array_merge( $_GET, $_POST );
        }
        $sig = isset( $param['sign'] ) ? $param['sign'] : $sig;

        if (empty( $sig ))
        {
            return false;
        }
        $sig = strtoupper( $sig );
        unset( $param['sign'] );

     

        //新验签方式
        $appSig = self::_genSignature( $secret, $param );
//         var_dump( $appSig);
        return ($appSig == $sig);
    }

    /**
     *  生成签名
     *
     * @param string $secret
     * @param String $param  - 请求的http参数
     * @return String        - 按照规则生成的sig
     */
    protected static function _genSignature( $secret, $param = array(), $newGen = true)
    {
        $str = self::params2str($param, $newGen);
        // var_dump( $str);
        // 后面加 screntKey
        $str = $str .$secret;
        // var_dump( $str);
        return strtoupper(md5( $str ));
    }

    private static function params2str($param = array(), $newGen) {
        // var_dump( $param);
        ksort( $param );
        // var_dump( $param);

        $str = array();
        foreach ( $param as $key => $v )
        {
            if($newGen) {
                if(is_null($v)) {
                    continue;
                }
                $str[] = $key . '=' . (is_array($v) ? self::params2str($v, $newGen) : $v);
            } else {
                $str[] = $key . '=' . $v;
            }
        }

        return implode( '', $str );
    }

    public function api_return($code,$data=[],$msg = 'success',$extendData = []){
        if ( is_array( $data) && empty( $data)) {
            $data = (object)[];
        }
        if ( is_null( $data)) {
            $data = [];
        }
        $aRet = ['code'=> $code, 'msg'=> $msg,'data'=>$data];
        if (  $extendData) {
            $aRet = array_merge( $aRet, $extendData);
        }
        echo json_encode( $aRet);
        exit();
    }

}